home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / mint110s.zoo / syscall.spp < prev    next >
Text File  |  1994-02-11  |  14KB  |  477 lines

  1. ; Copyright 1992 Eric R. Smith
  2. ; Copyright 1992,1993 Atari Corporation
  3. ; All rights reserved.
  4.  
  5. %include "magic.i"
  6. ;
  7. ; syscall: interface for system calls. The following entry points are
  8. ;    defined:
  9. ; _mint_bios:  entry point for the BIOS calls (trap #13)
  10. ; _mint_xbios: entry point for XBIOS calls (trap #14)
  11. ; _mint_dos:   entry point for GEMDOS calls (trap #1)
  12. ; _sig_return: user signal handlers return to this routine (see signal.c)
  13. ;              it is responsible for restoring the kernel's old context
  14. ;              via the Psigreturn() system call
  15. ; _lineA0:     calls the line A initialize routine
  16. ; _call_aes:   calls the GEM AES
  17. ; _call_dosound: calls the XBIOS Dosound() function
  18. ; _do_usrcall: calls a user supplied function (e.g. for Supexec), with
  19. ;           arguments supplied from global variables usrarg1, usrarg2, etc.
  20. ; _callout:    calls an external function, after first saving all registers,
  21. ;              and restores the registers afterward
  22. ;
  23. ; external variables referenced:
  24. ; _bios_tab, _bios_max:
  25. ;    table of entry points for BIOS routines, max # of routine
  26. ; _xbios_tab, _xbios_max:
  27. ;    ditto for XBIOS
  28. ; _dos_tab, _dos_max:
  29. ;    ditto for GEMDOS
  30. ; _curproc:
  31. ;    pointer to current process table entry, and hence to save area for
  32. ;    context (this is always the first entry in the PROC table).
  33. ; _valid_return:
  34. ;    used to indicate to the kernel that a valid return from user mode
  35. ;    is taking place
  36. ;
  37. ; _bconbuf, _bconbsiz, _bconbdev:
  38. ;    256 byte buffer for Bconout() output. If _bconbsiz is non-zero,
  39. ;    there are that many bytes in _bconbuf waiting to be flushed. The
  40. ;    output is for device _bconbdev.
  41. ;
  42. ; The C function enter_kernel() is called on entry to the kernel, and the
  43. ; function leave_kernel() is called on exit. These functions are responsible
  44. ; for saving and restoring the various trap vectors, so that MiNT can trap
  45. ; out to TOS directly, but programs can only trap to MiNT.
  46. ;
  47. ; we also call certain BIOS functions directly if these are known not to
  48. ; require saving/restoring of context
  49. ;
  50.     TEXT
  51.     
  52.     XDEF    _mint_bios,_mint_xbios
  53.     XDEF    _mint_dos
  54.     XREF    _build_context
  55.     XREF    _restore_context
  56.     XREF    _proc_clock        ; controls process' allocation of CPU time
  57.     XREF    _enter_kernel
  58.     XREF    _leave_kernel
  59.     XREF    _preempt
  60.  
  61.     XREF    _curproc
  62.     XREF    _bios_tab,_bios_max
  63.     XREF    _xbios_tab,_xbios_max,_old_xbios
  64.     XREF    _dos_tab,_dos_max
  65.  
  66.     XREF    _bconbuf,_bconbsiz,_bconbdev
  67.     XREF    _bflush
  68.  
  69.     XREF    _ubconstat,_do_bconin,_ubcostat,_kbshift
  70.     
  71. _mint_dos:
  72.     clr.w    -(sp)            ; no frame format needed
  73. ; NOTE: FOR NOW, WE PRESERVE A0 ACROSS GEMDOS CALLS. THIS WILL CHANGE
  74. ; SOMEDAY, DON'T RELY ON IT!!!
  75.     move.l    _curproc,d0        ; note: preserve all regs but d0
  76.     addq.l    #4,d0            ; for compatibility
  77.  
  78.     move.l    d0,-(sp)        ; push pointer to syscall context save
  79.     jsr    _build_context
  80.     lea    _dos_tab,a5        ; set syscall_tab
  81.     move.w    _dos_max,d5        ; set syscall_max
  82. ;
  83. ; copy parameters onto process stack. a0 and a1 were set by _build_context
  84. ;
  85.  
  86.     move.l    _curproc,a0
  87.     move.l    (a0),sp            ; this puts us in our private stack
  88.     move.l    24(a1),-(sp)        ; a1 was set by build_context
  89.     move.l    20(a1),-(sp)
  90.     move.l    16(a1),-(sp)
  91.     move.l    12(a1),-(sp)
  92.     move.l    8(a1),-(sp)
  93.     move.l    4(a1),-(sp)
  94.     move.l    (a1),-(sp)
  95.     move.w    #1,-(sp)        ; flag for in GEMDOS
  96.     jsr    _enter_kernel        ; set up vectors appropriately
  97.     addq.w    #2,sp
  98.     bra    _syscall
  99.  
  100. _mint_xbios:
  101. ;
  102. ; Kludge for Setscreen: under Falcon TOS, this
  103. ; calls a GEMDOS function (Srealloc) and so
  104. ; we must *not* change any of the vectors!!
  105.  
  106.     btst    #5,(sp)            ; test for user/super mode
  107.     beq.s    LX_usr
  108. %ifdef ONLY030
  109.     lea    8(sp),a1
  110. %else
  111.     lea    6(sp),a1        ; supervisor mode: args on stack
  112.     tst.w    ($59e).w        ; test longframe
  113.     beq.s    LX_check
  114.     addq.w    #2,a1            ; stack is a bit bigger
  115. %endif
  116.     bra.s    LX_check
  117. LX_usr:
  118.     move.l    usp,a1            ; user mode: args on user stack
  119. LX_check:
  120.     cmp.w    #5,(a1)            ; check for Setscreen command
  121.     beq.s    LX_screen        ; no -- fall through
  122.  
  123.     clr.w    -(sp)            ; no frame format needed
  124.     move.l    _curproc,a0
  125.     pea    4(a0)            ; push pointer to syscall context save
  126.     jsr    _build_context
  127.     lea    _xbios_tab,a5        ; set syscall_tab
  128.     move.w    _xbios_max,d5        ; set syscall_max
  129. ;
  130. ; copy parameters onto process stack. a0 and a1 were set by _build_context
  131. ;
  132.  
  133.     move.l    _curproc,a0
  134.     move.l    (a0),sp            ; this puts us in our private stack
  135.     move.l    24(a1),-(sp)        ; a1 was set by build_context
  136.     move.l    20(a1),-(sp)
  137.     move.l    16(a1),-(sp)
  138.     move.l    12(a1),-(sp)
  139.     move.l    8(a1),-(sp)
  140.     move.l    4(a1),-(sp)
  141.     move.l    (a1),-(sp)
  142.     move.w    #0,-(sp)        ; flag: NOT GEMDOS
  143.     jsr    _enter_kernel        ; set up vectors appropriately
  144.     addq.w    #2,sp
  145.     bra    _syscall
  146. ;
  147. ; For setscreen, jump directly to the ROM vector --
  148. ; this avoids all hazards (like changing the vectors)
  149.  
  150. LX_screen:
  151.     move.l    _old_xbios+8,a0
  152.     jmp    (a0)
  153.  
  154.  
  155. _mint_bios:
  156. ;
  157. ; Entering the kernel can be very expensive; so, we take a short-cut
  158. ; if possible -- we try some BIOS functions out, and if they
  159. ; succeed without blocking then we're done; otherwise, we go
  160. ; through the long procedure for entering the kernel
  161. ;
  162. ; These shortcuts aren't done when we're called in supervisor mode,
  163. ; because TOS uses very tiny stacks (smaller than we want); the
  164. ; shortcuts operate on the user-supplied ssp, whereas the "full"
  165. ; BIOS code works on our (private) system stack
  166. ;
  167. ; the shortcuts are also turned off if BIOSBUF=n
  168. ;
  169.     move.w    #0,-(sp)        ; flag: NOT a GEMDOS call
  170.     jsr    _enter_kernel        ; set up BIOS vectors
  171.     addq.w    #2,sp
  172.     tst.w    _bconbdev        ; is BIOS buffering on?
  173.     bmi    L_bios            ; no; skip all this
  174.  
  175.     btst    #5,(sp)            ; test for user/super mode
  176.     bne.s    L_bios            ; if super, goto L_bios
  177.     tst.w    _proc_clock        ; are we about to be preempted?
  178.     beq.s    L_bios
  179.  
  180.     move.l    usp,a1            ; user mode: args on user stack
  181. L_ubios:
  182.     move.w    (a1),d0            ; get command
  183.     cmp.w    #3,d0            ; Bconout?
  184.     beq    do_bconout        ; yes -- go do it
  185. ;
  186. ; most of the remaining functions require BIOS vectors to be properly
  187. ; set up
  188.     tst.w    _bconbsiz        ; is BIOS output waiting?
  189.     bne.s    L_bios            ; yes -- do regular code
  190.  
  191. ; test for various BIOS functions
  192.     cmp.w    #1,d0            ; Bconstat?
  193.     bne.s    L_00
  194.     move.w    2(a1),-(sp)        ; push arg
  195.     jsr    _ubconstat
  196. L_1out:
  197.     addq.l    #2,sp
  198. L_0out:
  199.     move.l    d0,-(sp)        ; save d0
  200.     ori.w    #$0700,sr        ; spl7()
  201.     jsr    _leave_kernel
  202.     move.l    (sp)+,d0        ; retrieve value to be returned
  203.     rte                ; return to user
  204. L_00:
  205.     cmp.w    #2,d0            ; Bconin?
  206.     bne.s    L_01
  207.     move.w    2(a1),-(sp)        ; yes; push argument
  208.     jsr    _do_bconin
  209.     addq.w    #2,sp
  210.     cmp.w    #$dead,d0        ; would Bconin block?
  211.     bne.s    L_0out            ; no -- we're done
  212.     bra.s    L_bios            ; yes -- do the long stuff
  213. L_01:
  214.     cmp.w    #8,d0            ; Bcostat?
  215.     bne.s    L_02
  216.     move.w    2(a1),-(sp)        ; push device
  217.     jsr    _ubcostat        ; get status
  218.     bra.s    L_1out
  219. L_02:
  220.     cmp.w    #11,d0            ; Kbshift?
  221.     bne.s    L_bios
  222.     move.w    2(a1),-(sp)        ; push arg
  223.     jsr    _kbshift
  224.     bra.s    L_1out
  225.  
  226. L_bios:
  227.     clr.w    -(sp)            ; no frame format needed
  228.     move.l    _curproc,a0
  229.     pea    4(a0)            ; push pointer to syscall context save
  230.     jsr    _build_context
  231.     lea    _bios_tab,a5        ; set syscall_tab
  232.     move.w    _bios_max,d5        ; set syscall_max
  233. ;
  234. ; copy parameters onto process stack. a0 and a1 were set by _build_context
  235. ;
  236.  
  237.     move.l    _curproc,a0
  238.     move.l    (a0),sp            ; this puts us in our private stack
  239.     move.l    24(a1),-(sp)        ; a1 was set by build_context
  240.     move.l    20(a1),-(sp)
  241.     move.l    16(a1),-(sp)
  242.     move.l    12(a1),-(sp)
  243.     move.l    8(a1),-(sp)
  244.     move.l    4(a1),-(sp)
  245.     move.l    (a1),-(sp)
  246.  
  247. _syscall:
  248. ;
  249. ; check here to see if we need to flush the Bconout() buffer
  250. ;
  251.     tst.w    _bconbsiz        ; characters in buffer?
  252.     beq.s    L_noflush        ; no: OK to proceed
  253. ;
  254. ; watch out, this could cause a context switch
  255. ;
  256.     jsr    _bflush            ; flush the buffer
  257.  
  258. L_noflush:
  259. ;
  260. ; figure out which routine to call
  261. ;
  262.     move.w    (sp),d0
  263.     cmp.w    #-1,d0            ; trapping with -1 means return
  264.     bne.s    check_max        ; the corresponding system table
  265.     move.l    a5,d0
  266.     bra.s    out
  267. check_max:
  268.     cmp.w    d5,d0
  269.     bcc.s    error
  270.     add.w    d0,d0
  271.     add.w    d0,d0            ; multiply by 4
  272.     move.l    0(a5,d0.w),d0        ; d0 = syscall_tab[d0]
  273.     beq.s    error            ; null entry means invalid call
  274.     addq.w    #2,sp            ; pop function number off stack
  275.     move.l    d0,a0
  276.     jsr    (a0)            ; go do the call
  277. out:
  278.     move.l    _curproc,a0